#ifndef WIDGET_H
#define WIDGET_H
#include <QPixmap>
#include <QPalette>
#include <QBitmap>
#include <QWidget>
#include<QPainter>
#include<QTimer>
#include<QLine>
#include<QVector>
#include<QKeyEvent>
#include <QCoreApplication>
#include<QDateTime>
#include <QDebug>
#include <QRandomGenerator>
QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACE
//background--width:500  height:500  X:200
enum Color{RED=0,BLUE,GREEN,PURPLE};  //4种颜色的方块
enum Type{Type1=0,Type2,Type3,Type4,Type5};     //5种形状的方块     田字形     Z形  J形    一条直线   T形
enum Diretion{LEFT,RIGHT,DOWN};
struct Block{
    int width=  25;
    int height=25;
    QVector<QPair<int,int>> cur_bk; //当前方块的分布     //前一个为 row   后一个为  col
   QVector< QVector<QPair<int,int>>>  next_bk;   //下一个方块的分布
    int next_pos=1;
    Color color;    //方块的颜色类型
    Type type;
};
class BlockManger
{
public:
    BlockManger()
    {
        blockMap.resize(20);
        for(int i=0;i<20;i++)
            blockMap[i].resize(20,{false,RED});
        ProduceNewBlock();      //生成最初的方块
    }
public:
    QVector<QVector<QPair<bool,Color>>> blockMap;
    Block cur_block;        //当前正在操作的方块
    bool end=false;         //当前游戏是否结束
    bool autoDownMove=false;        //是否可以自动向下移动
    bool arriveBottom=false;
    int score=0;        //当前的分数
    int descent_speed=200;  //下落的默认速度 --之后可由玩家确认
    int descent_ready=0;
    int descent_frequency=2400; //当descent_ready>descent_frequency才能下落
    int stagnate_frequency=1000;
    int stagnate_ready=0;
    void RenewBlockPosition(const Diretion& direction);      //更新方块的位置
    bool JudgeBlockMove(const Diretion&direction);
    bool IsBlockArriveBottom();     //判断方块是否触底
    void ProduceNewBlock();          //随机生成一个新的方块
    void RenewBlockMap();           //更新总体方块的分布
    bool JudgeBlockShapeChange();    //判断方块是否改变形状
    void ChangeBlockShape();        //改变方块形状
    void RenewGameResult();       //更新游戏结果
    void RenewBlockAutoDescent();       //更新方块自动下降的频率
    void DispelLine();
    int num=1;
};

class Widget : public QWidget
{
    Q_OBJECT
public:
    int updatefrequency=60; //画面更新频率
    QTimer* tm=new QTimer(this);
    BlockManger bm;
public:
    void paintEvent(QPaintEvent* pe)override;
    void keyPressEvent(QKeyEvent *event) override;
    void DrawLine(QPainter* pa);
    void initData();
    void DrawBlockMap(QPainter* pa);
    void DrawBlock(QPainter*pa,Color color,int x,int y,int wid,int height);
    void DrawScore();
    bool stop=true;
    bool first_start=true;
public:
    Widget(QWidget *parent = nullptr);
    ~Widget();


private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();



    void on_pushButton_4_pressed();

    void on_pushButton_6_pressed();

    void on_pushButton_5_pressed();

private:
    Ui::Widget *ui;
};


#endif // WIDGET_H
